#include<bits/stdc++.h>
#define ll long long
#define stdin stdin
#define stdout stdout
using namespace std;
const int MAXN=1e5+5;
struct Info{
    int l,r,u;
};
int n,m,T,L,V,b[MAXN],cn,d,v,a,x;
bool vis[MAXN],op;
Info c[MAXN],tmp;
Info make(int d,int v,int a){
    if(a==0){
        if(v<=V) return {-1,-1,0};
        return {d,L,1};
    }else if (a>0){
        if(v>V) return {d,L,1};
        x=d+(V*V-v*v)/(2*a)+1;
        if(x<=L) return {x,L,1};
        return {-1,-1,0};
    }else if (a<0){
        if(v<=V) return {-1,-1,0};
        x=d+(v*v-V*V)/(2*(-a));
        if((v*v-V*V)%(2*(-a))==0) x--;
        return {d,x,1};
    }
    return {-1,-1,0};
}
bool cmp(Info a,Info b){
    if(a.r!=b.r) return a.r>b.r;
    return a.l>b.l;
}
void solve1(){
    for(int i=1;i<=cn;i++){
        if(c[i].l<=b[m]){
            printf("%d %d\n",cn-i+1,m-1);
            return;
        }
    }
    printf("0 %d\n",m);
}
void solve2(){

}
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    scanf("%d",&T);
    while(T--){
        cn=0,op=1;
        scanf("%d%d%d%d",&n,&m,&L,&V);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&d,&v,&a);
            if(a<0) op=0;
            tmp=make(d,v,a);
            if(tmp.u) c[++cn]=tmp;
            //cout<<c[i].l<<' '<<c[i].r<<' '<<c[i].u<<endl;
        }
        for(int i=1;i<=m;i++){
            scanf("%d",&b[i]);
        }
        sort(c+1,c+cn+1,cmp);
        if(op) solve1();
        else solve2();
    }
    return 0;
}
